home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 5 / Gold Medal Software - Volume 5 (Gold Medal) (1995).iso / music / short121.arj / POLY.C < prev    next >
Text File  |  1994-11-14  |  2KB  |  64 lines

  1. /******************************************************************************
  2. *                                                                             *
  3. *       Copyright (C) 1992,1993,1994 Tony Robinson                            *
  4. *                                                                             *
  5. *       See the file LICENSE for conditions on distribution and usage         *
  6. *                                                                             *
  7. ******************************************************************************/
  8.  
  9. # include <math.h>
  10. # include <stdio.h>
  11. # include "shorten.h"
  12.  
  13. # define ALPHA0 (3.0 / 2.0)
  14. # define ALPHA1 M_LN2
  15.  
  16. int wav2poly(buf, nbuf, offset, version, psigbit, presbit) long *buf; int nbuf;
  17.     long offset; int version; float *psigbit, *presbit; {
  18.   long  sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0, sum;
  19.   long  last0 = buf[-1] - offset;
  20.   long  last1 = buf[-1] - buf[-2];
  21.   long  last2 = last1 - (buf[-2] - buf[-3]);
  22.   float alpha = (version == 0) ? ALPHA0 : ALPHA1;
  23.   int   i, fnd;
  24.  
  25.   for(i = 0; i < nbuf; i++) {
  26.     long diff0, diff1, diff2;
  27.  
  28.     sum0 += labs(diff0 = buf[i] - offset);
  29.     sum1 += labs(diff1 = diff0 - last0);
  30.     sum2 += labs(diff2 = diff1 - last1);
  31.     sum3 += labs(        diff2 - last2);
  32.  
  33.     last0 = diff0;
  34.     last1 = diff1;
  35.     last2 = diff2;
  36.   }
  37.  
  38.   if(sum0 < MIN(MIN(sum1, sum2), sum3)) {
  39.     sum = sum0;
  40.     fnd = FN_DIFF0;
  41.   }
  42.   else if(sum1 < MIN(sum2, sum3)) {
  43.     sum = sum1;
  44.     fnd = FN_DIFF1;
  45.   }
  46.   else if(sum2 < sum3) {
  47.     sum = sum2;
  48.     fnd = FN_DIFF2;
  49.   }
  50.   else {
  51.     sum = sum3;
  52.     fnd = FN_DIFF3;
  53.   }
  54.  
  55.   /* return the expected number of bits per original signal sample */
  56.   *psigbit = (sum0 > 0) ? log(alpha * sum0 / (double) nbuf) / M_LN2 : 0.0;
  57.  
  58.   /* return the expected number of bits per residual signal sample */
  59.   *presbit = (sum  > 0) ? log(alpha * sum  / (double) nbuf) / M_LN2 : 0.0;
  60.  
  61.   return(fnd);
  62. }
  63.  
  64.